using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._DefenseTools._Visibility
{
    /// <summary>
    /// <para>Radial Line Of Sight And Range</para>
    /// <para>Shows  areas visible to one or more observer locations given a specified distance and viewing angle.</para>
    /// <para>显示给定指定距离和视角的一个或多个观察点位置可见的区域。</para>
    /// </summary>    
    [DisplayName("Radial Line Of Sight And Range")]
    public class RadialLineOfSightAndRange : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public RadialLineOfSightAndRange()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_observer_features">
        /// <para>Input Observer</para>
        /// <para>The input observer points.</para>
        /// <para>输入观察点。</para>
        /// </param>
        /// <param name="_in_surface">
        /// <para>Input Surface</para>
        /// <para>The input elevation raster surface. The elevation surface must be projected.</para>
        /// <para>输入高程栅格表面。必须投影高程表面。</para>
        /// </param>
        /// <param name="_out_viewshed_feature_class">
        /// <para>Output Viewshed Feature Class</para>
        /// <para>The output polygon feature class showing visible and nonvisible areas.</para>
        /// <para>显示可见区域和不可见区域的输出面要素类。</para>
        /// </param>
        /// <param name="_out_fov_feature_class">
        /// <para>Output Field of View Outline Feature Class</para>
        /// <para>The output polygon feature class containing the field of view range fan.</para>
        /// <para>包含视场范围扇形的输出面要素类。</para>
        /// </param>
        /// <param name="_out_range_radius_feature_class">
        /// <para>Output Range</para>
        /// <para>The output polygon feature class containing the viewing sector created by the range radius, start angle, and end angle.</para>
        /// <para>输出面要素类，包含由范围半径、起始角度和结束角度创建的查看扇区。</para>
        /// </param>
        public RadialLineOfSightAndRange(object _in_observer_features, object _in_surface, object _out_viewshed_feature_class, object _out_fov_feature_class, object _out_range_radius_feature_class)
        {
            this._in_observer_features = _in_observer_features;
            this._in_surface = _in_surface;
            this._out_viewshed_feature_class = _out_viewshed_feature_class;
            this._out_fov_feature_class = _out_fov_feature_class;
            this._out_range_radius_feature_class = _out_range_radius_feature_class;
        }
        public override string ToolboxName => "Defense Tools";

        public override string ToolName => "Radial Line Of Sight And Range";

        public override string CallName => "defense.RadialLineOfSightAndRange";

        public override List<string> AcceptEnvironments => ["outputCoordinateSystem", "scratchWorkspace", "workspace"];

        public override object[] ParameterInfo => [_in_observer_features, _in_surface, _out_viewshed_feature_class, _out_fov_feature_class, _out_range_radius_feature_class, _observer_height_offset, _inner_radius, _outer_radius, _horizontal_start_angle, _horizontal_end_angle];

        /// <summary>
        /// <para>Input Observer</para>
        /// <para>The input observer points.</para>
        /// <para>输入观察点。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Observer")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_observer_features { get; set; }


        /// <summary>
        /// <para>Input Surface</para>
        /// <para>The input elevation raster surface. The elevation surface must be projected.</para>
        /// <para>输入高程栅格表面。必须投影高程表面。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Surface")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_surface { get; set; }


        /// <summary>
        /// <para>Output Viewshed Feature Class</para>
        /// <para>The output polygon feature class showing visible and nonvisible areas.</para>
        /// <para>显示可见区域和不可见区域的输出面要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Viewshed Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_viewshed_feature_class { get; set; }


        /// <summary>
        /// <para>Output Field of View Outline Feature Class</para>
        /// <para>The output polygon feature class containing the field of view range fan.</para>
        /// <para>包含视场范围扇形的输出面要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Field of View Outline Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_fov_feature_class { get; set; }


        /// <summary>
        /// <para>Output Range</para>
        /// <para>The output polygon feature class containing the viewing sector created by the range radius, start angle, and end angle.</para>
        /// <para>输出面要素类，包含由范围半径、起始角度和结束角度创建的查看扇区。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Range")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_range_radius_feature_class { get; set; }


        /// <summary>
        /// <para>Observer Height Offset (meters)</para>
        /// <para>The height added to the surface elevation of the observer. The default is 2.</para>
        /// <para>添加到观察点表面高程的高度。默认值为 2。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Observer Height Offset (meters)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _observer_height_offset { get; set; } = 2;


        /// <summary>
        /// <para>Minimum Distance (meters)</para>
        /// <para>The minimum (nearest) distance from observers to consider for analysis in meters. The default is 1000.</para>
        /// <para>分析时要考虑的与观察点的最小（最近）距离，单位为米。默认值为 1000。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Minimum Distance (meters)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _inner_radius { get; set; } = 1000;


        /// <summary>
        /// <para>Maximum Distance (meters)</para>
        /// <para>The maximum (farthest) distance from observers to consider for analysis in meters. The default is 3000.</para>
        /// <para>分析时要考虑的与观察者的最大（最远）距离，以米为单位。默认值为 3000。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Maximum Distance (meters)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _outer_radius { get; set; } = 3000;


        /// <summary>
        /// <para>Horizontal Start Angle (degrees)</para>
        /// <para>The left bearing limit in degrees. The default is 0.</para>
        /// <para>以度为单位的左方位角限制。默认值为 0。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Horizontal Start Angle (degrees)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _horizontal_start_angle { get; set; } = 0;


        /// <summary>
        /// <para>Horizontal End Angle (degrees)</para>
        /// <para>The right bearing limit in degrees. The default is 360.</para>
        /// <para>以度为单位的右方位角限制。默认值为 360。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Horizontal End Angle (degrees)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double _horizontal_end_angle { get; set; } = 360;


        public RadialLineOfSightAndRange SetEnv(object outputCoordinateSystem = null, object scratchWorkspace = null, object workspace = null)
        {
            base.SetEnv(outputCoordinateSystem: outputCoordinateSystem, scratchWorkspace: scratchWorkspace, workspace: workspace);
            return this;
        }

    }

}